﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Diagnostics;
using System.Resources;
using System.Windows;
using System.Windows.Markup;
using System.Windows.Navigation;
using Microsoft.Phone.Controls;
using Microsoft.Phone.Shell;
using DnD.Resources;
using DnD.ViewModels;
using DnD.Model;

namespace DnD
{
    public partial class App : Application
    {


        public static Dictionary<string, object> appStateMap;

        /// <summary>
        /// Provides easy access to the root frame of the Phone Application.
        /// </summary>
        /// <returns>The root frame of the Phone Application.</returns>
        public static PhoneApplicationFrame RootFrame { get; private set; }

        /// <summary>
        /// Constructor for the Application object.
        /// </summary>
        public App()
        {
            // Global handler for uncaught exceptions.
            UnhandledException += Application_UnhandledException;

            // Standard XAML initialization
            InitializeComponent();

            // Phone-specific initialization
            InitializePhoneApplication();

            // Language display initialization
            InitializeLanguage();

            // Show graphics profiling information while debugging.
            if (Debugger.IsAttached)
            {
                // Display the current frame rate counters.
                Application.Current.Host.Settings.EnableFrameRateCounter = true;

                // Show the areas of the app that are being redrawn in each frame.
                //Application.Current.Host.Settings.EnableRedrawRegions = true;

                // Enable non-production analysis visualization mode,
                // which shows areas of a page that are handed off to GPU with a colored overlay.
                //Application.Current.Host.Settings.EnableCacheVisualization = true;

                // Prevent the screen from turning off while under the debugger by disabling
                // the application's idle detection.
                // Caution:- Use this under debug mode only. Application that disables user idle detection will continue to run
                // and consume battery power when the user is not using the phone.
                PhoneApplicationService.Current.UserIdleDetectionMode = IdleDetectionMode.Disabled;
            }
            if (appStateMap == null)
            {
                appStateMap = new Dictionary<string, object>();
            }

            try
            {
                using (var context = new DnDDataContext(DnDDataContext.DbConnectionString))
                {
                    if (context.DatabaseExists() == false)
                    {
                        context.CreateDatabase();


                        String[] picsList = new String[] { "http://fc06.deviantart.net/fs71/f/2012/144/3/a/family_guy_by_jamieb91-d50xdnm.jpg", "http://th00.deviantart.net/fs33/200H/f/2008/240/b/5/Dragon_of_spirits_by_Ruth_Tay.jpg", "http://www.hdwallpapers.in/walls/space_war_game_scene-HD.jpg", "http://gamepod.hu/dl/cnt/2010-09/64212/starcraft_2.png", "http://www.hardwareluxx.de/images/stories/galleries/reviews/asus_g75_2/asus_g75_3_s.jpg", "http://mobilarena.hu/dl/cnt/2012-05/85903/sony-ericsson-xperia-play.jpg", "http://data.whicdn.com/images/62908780/large.jpg", "http://data.whicdn.com/images/62909004/large.jpg", "http://data.whicdn.com/images/62908392/large.jpg", "http://data.whicdn.com/images/62908331/large.jpg", "http://data.whicdn.com/images/62907739/large.jpg", "/Assets/Pictures/CardPictures/kep2.png", "/Assets/Pictures/CardPictures/kep3.jpg", "/Assets/Pictures/CardPictures/kep1.jpg" };
                        Random rnd = new Random();

                       //Deck newDeck = new Deck("testDeck" , "testleiras", picsList[((int)(rnd.NextDouble() * 10)) % picsList.Length]);
                       //   context.GameItems.InsertOnSubmit(newDeck);
                       // context.SubmitChanges();

                       // Card newCard = new Card( "testCard" , "Lorem ipsum dolor sit amet, consectetur adipisicing elit...", picsList[((int)(rnd.NextDouble() * 100)) % picsList.Length], "action", 1);
                       //newCard.Rate = ((int)(rnd.NextDouble() * 10)) % 5;
                       //context.GameItems.InsertOnSubmit(newCard);
                       // context.SubmitChanges();

                       // CardDeck cardDeck = new CardDeck();
                       // cardDeck.DeckRef = newDeck;
                       // cardDeck.CardRef = newCard;
                       // context.CardDecks.InsertOnSubmit(cardDeck);
                       // context.SubmitChanges();


                       // newCard.Decks.Add(cardDeck);
                       // newDeck.Cards.Add(cardDeck);
                       // context.SubmitChanges();


                        Double deckCount = rnd.NextDouble() * 20;


                        for (double i = 0; i < deckCount; i++)
                        {
                            Deck newDeck = new Deck("testDeck" + i.ToString(), "testleiras " + "testDeck" + i.ToString(), picsList[((int)(rnd.NextDouble() * 10)) % picsList.Length]);
                            //context.GameItems.InsertOnSubmit(newDeck);
                            newDeck.Rate = ((int)(rnd.NextDouble() * 10)) % 5;
                            newDeck.Local = false;
                            context.GameItems.InsertOnSubmit(newDeck);
                            context.SubmitChanges();

                            Double cardCount = rnd.NextDouble() * 30;
                            for (double j = 0; j < cardCount; j++)
                            {
                                Card newCard = new Card(j.ToString() + "testCard" + i.ToString(), "Lorem ipsum dolor sit amet, consectetur adipisicing elit...", picsList[((int)(rnd.NextDouble() * 100)) % picsList.Length], "action", 1);
                                newCard.Rate = ((int)(rnd.NextDouble() * 10)) % 5;
                                newCard.Local = false;
                                //newCard.Decks = new System.Data.Linq.EntitySet<CardDeck>();
                              
                               
                                //newDeck.Cards = new System.Data.Linq.EntitySet<CardDeck>();
                                




                                context.GameItems.InsertOnSubmit(newCard);
                                context.SubmitChanges();

                                CardDeck cardDeck = new CardDeck();
                                cardDeck.CardRef = newCard;
                                cardDeck.DeckRef = newDeck;
                                cardDeck.Local = false;
                                context.CardDecks.InsertOnSubmit(cardDeck);
                                context.SubmitChanges();

                                newCard.Decks.Add(cardDeck);
                                newDeck.Cards.Add(cardDeck);
                                context.SubmitChanges();


                                DnDAction vulcanAction = new DnDAction("Volcano Action", "Volcano action", "/Assets/Pictures/ActionIcon/volcano_black.png");
                                DnDAction drinkAction = new DnDAction("Drink Action", "Drink action", "/Assets/Pictures/ActionIcon/cocktail_black.png");
                                drinkAction.Amount = 3;
                                context.GameItems.InsertOnSubmit(vulcanAction);
                                context.GameItems.InsertOnSubmit(drinkAction);
                                context.SubmitChanges();


                                CardAction vulcanCardAction = new CardAction();
                                vulcanCardAction.ActionRef = vulcanAction;
                                vulcanCardAction.CardRef = newCard;
                                context.CardActions.InsertOnSubmit(vulcanCardAction);
                                context.SubmitChanges();

                                CardAction drinkCardAction = new CardAction();
                                drinkCardAction.ActionRef = drinkAction;
                                drinkCardAction.CardRef = newCard;
                                context.CardActions.InsertOnSubmit(drinkCardAction);
                                context.SubmitChanges();

                                drinkAction.Cards.Add(vulcanCardAction);
                                vulcanAction.Cards.Add(drinkCardAction);
                                newCard.Actions.Add(drinkCardAction);
                                newCard.Actions.Add(vulcanCardAction);
                                context.SubmitChanges();
                                
                            }





                        }
                        //context.SubmitChanges();

                        //context.GameItems.InsertOnSubmit(new Deck("testDeck1", "testleiras", "http://fc06.deviantart.net/fs71/f/2012/144/3/a/family_guy_by_jamieb91-d50xdnm.jpg"));


                        //context.GameItems.InsertOnSubmit(new Card("testCard1", "testleiras", "http://th00.deviantart.net/fs33/200H/f/2008/240/b/5/Dragon_of_spirits_by_Ruth_Tay.jpg", "action", 1));
                        //context.GameItems.InsertOnSubmit(new Card("testCard2", "testleiras", "http://www.hdwallpapers.in/walls/space_war_game_scene-HD.jpg", "action", 1));
                        //context.GameItems.InsertOnSubmit(new Card("testCard4", "testleiras", "http://gamepod.hu/dl/cnt/2010-09/64212/starcraft_2.png", "action", 1));
                        //context.GameItems.InsertOnSubmit(new Card("testCard5", "testleiras", "http://www.hardwareluxx.de/images/stories/galleries/reviews/asus_g75_2/asus_g75_3_s.jpg", "action", 1));
                        //context.GameItems.InsertOnSubmit(new Card("testCard6", "testleiras", "http://mobilarena.hu/dl/cnt/2012-05/85903/sony-ericsson-xperia-play.jpg", "action", 1));

                        
                    }
                }
            }
            catch (Exception e)
            {
                Debug.WriteLine(e.ToString());
            }

        }

        // Code to execute when the application is launching (eg, from Start)
        // This code will not execute when the application is reactivated
        private void Application_Launching(object sender, LaunchingEventArgs e)
        {
        }

        // Code to execute when the application is activated (brought to foreground)
        // This code will not execute when the application is first launched
        private void Application_Activated(object sender, ActivatedEventArgs e)
        {
            appStateMap = new Dictionary<string, object>();
            foreach(string key in PhoneApplicationService.Current.State.Keys)
            {
                appStateMap[key] = PhoneApplicationService.Current.State[key];

            }
            if (App.appStateMap.ContainsKey("userName") && App.appStateMap.ContainsKey("sessionID") && App.appStateMap["userName"] != null && App.appStateMap["sessionID"] != null)
            {
                UserViewModel.userName = (string)App.appStateMap["userName"];
                UserViewModel.sessionID = (string)App.appStateMap["sessionID"];

            }

            
           
        }

        // Code to execute when the application is deactivated (sent to background)
        // This code will not execute when the application is closing
        private void Application_Deactivated(object sender, DeactivatedEventArgs e)
        {
            if (appStateMap!=null && appStateMap.Count!=0)
            {
                foreach (string key in appStateMap.Keys)
                {

                    PhoneApplicationService.Current.State[key] = appStateMap[key];
                }
            }
        }

        // Code to execute when the application is closing (eg, user hit Back)
        // This code will not execute when the application is deactivated
        private void Application_Closing(object sender, ClosingEventArgs e)
        {
        }

        // Code to execute if a navigation fails
        private void RootFrame_NavigationFailed(object sender, NavigationFailedEventArgs e)
        {
            if (Debugger.IsAttached)
            {
                // A navigation has failed; break into the debugger
                Debugger.Break();
            }
        }

        // Code to execute on Unhandled Exceptions
        private void Application_UnhandledException(object sender, ApplicationUnhandledExceptionEventArgs e)
        {
            if (Debugger.IsAttached)
            {
                // An unhandled exception has occurred; break into the debugger
                Debugger.Break();
            }
            
        }

        #region Phone application initialization

        // Avoid double-initialization
        private bool phoneApplicationInitialized = false;

        // Do not add any additional code to this method
        private void InitializePhoneApplication()
        {
            if (phoneApplicationInitialized)
                return;

            // Create the frame but don't set it as RootVisual yet; this allows the splash
            // screen to remain active until the application is ready to render.
            RootFrame = new TransitionFrame();
            RootFrame.Navigated += CompleteInitializePhoneApplication;

            // Handle navigation failures
            RootFrame.NavigationFailed += RootFrame_NavigationFailed;

            // Handle reset requests for clearing the backstack
            RootFrame.Navigated += CheckForResetNavigation;

            // Ensure we don't initialize again
            phoneApplicationInitialized = true;
        }

        // Do not add any additional code to this method
        private void CompleteInitializePhoneApplication(object sender, NavigationEventArgs e)
        {
            // Set the root visual to allow the application to render
            if (RootVisual != RootFrame)
                RootVisual = RootFrame;

            // Remove this handler since it is no longer needed
            RootFrame.Navigated -= CompleteInitializePhoneApplication;
        }

        private void CheckForResetNavigation(object sender, NavigationEventArgs e)
        {
            // If the app has received a 'reset' navigation, then we need to check
            // on the next navigation to see if the page stack should be reset
            if (e.NavigationMode == NavigationMode.Reset)
                RootFrame.Navigated += ClearBackStackAfterReset;
        }

        private void ClearBackStackAfterReset(object sender, NavigationEventArgs e)
        {
            // Unregister the event so it doesn't get called again
            RootFrame.Navigated -= ClearBackStackAfterReset;

            // Only clear the stack for 'new' (forward) and 'refresh' navigations
            if (e.NavigationMode != NavigationMode.New && e.NavigationMode != NavigationMode.Refresh)
                return;

            // For UI consistency, clear the entire page stack
            while (RootFrame.RemoveBackEntry() != null)
            {
                ; // do nothing
            }
        }

        #endregion

        // Initialize the app's font and flow direction as defined in its localized resource strings.
        //
        // To ensure that the font of your application is aligned with its supported languages and that the
        // FlowDirection for each of those languages follows its traditional direction, ResourceLanguage
        // and ResourceFlowDirection should be initialized in each resx file to match these values with that
        // file's culture. For example:
        //
        // AppResources.es-ES.resx
        //    ResourceLanguage's value should be "es-ES"
        //    ResourceFlowDirection's value should be "LeftToRight"
        //
        // AppResources.ar-SA.resx
        //     ResourceLanguage's value should be "ar-SA"
        //     ResourceFlowDirection's value should be "RightToLeft"
        //
        // For more info on localizing Windows Phone apps see http://go.microsoft.com/fwlink/?LinkId=262072.
        //
        private void InitializeLanguage()
        {
            try
            {
                // Set the font to match the display language defined by the
                // ResourceLanguage resource string for each supported language.
                //
                // Fall back to the font of the neutral language if the Display
                // language of the phone is not supported.
                //
                // If a compiler error is hit then ResourceLanguage is missing from
                // the resource file.
                RootFrame.Language = XmlLanguage.GetLanguage(AppResources.ResourceLanguage);

                // Set the FlowDirection of all elements under the root frame based
                // on the ResourceFlowDirection resource string for each
                // supported language.
                //
                // If a compiler error is hit then ResourceFlowDirection is missing from
                // the resource file.
                FlowDirection flow = (FlowDirection)Enum.Parse(typeof(FlowDirection), AppResources.ResourceFlowDirection);
                RootFrame.FlowDirection = flow;
            }
            catch
            {
                // If an exception is caught here it is most likely due to either
                // ResourceLangauge not being correctly set to a supported language
                // code or ResourceFlowDirection is set to a value other than LeftToRight
                // or RightToLeft.

                if (Debugger.IsAttached)
                {
                    Debugger.Break();
                }

                throw;
            }
        }
    }
}